package com.sisgesbyte.dao.seguridad;

import java.util.List;

import javax.ejb.Stateless;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import com.sisgesbyte.dao.beanDao.AccesoLocalizacionDetRequest;
import com.sisgesbyte.dao.beanDao.FiltrosSQLBean;
import com.sisgesbyte.dao.utilDao.CreaFiltroSqlString;
import com.sisgesbyte.data.entity.comun.GenericEntity;
import com.sisgesbyte.data.entity.seguridad.AccesoLocalizacionListaEntity;
import com.sisgesbyte.data.util.AbstractFacade;

@Stateless
public class MantenimientoAccesoLocalalizacionDaoImpl extends AbstractFacade<AccesoLocalizacionListaEntity> implements
		MantenimientoAccesoLocalalizacionDao {
	
	@Inject
	private CreaFiltroSqlString creaFiltroSqlString;
	
	@PersistenceContext(unitName = "SigesSiscompPU")
	private EntityManager em;

	@Override
	protected EntityManager getEntityManager() {
		return em;
	}
	
	public MantenimientoAccesoLocalalizacionDaoImpl(){
		super(AccesoLocalizacionListaEntity.class);
	}
	@Override
	public List<AccesoLocalizacionListaEntity> listarAccesoLocalizacion(FiltrosSQLBean cadenaFiltros) {

		StringBuilder jpql = new StringBuilder();
			jpql.append("select al.id, al.usuario_id,u.usuario, al.pais_id, p.nombre pais , al.division_pais_id,dp.nombre division, al.ciudad_id, c.nombre ciudad, al.active ");
			jpql.append("from seguridad.acceso_localizacion al ");
			jpql.append("inner join seguridad.usuario u on al.usuario_id=u.id ");
			jpql.append("inner join localizacion.pais p on al.pais_id=p.id ");
			jpql.append("inner join localizacion.division_pais dp on al.division_pais_id = dp.id ");
			jpql.append("inner join localizacion.ciudad c on al.ciudad_id=c.id ");

			// concatenamos el filtro
			if (cadenaFiltros != null) {
				StringBuilder filtro = new StringBuilder();
				filtro.append(creaFiltroSqlString.concatenar(cadenaFiltros));
				jpql.append(filtro.toString());
			}
			Query query = em.createNativeQuery(jpql.toString(),AccesoLocalizacionListaEntity.class);
			if (cadenaFiltros != null && cadenaFiltros.getListaValores() != null
					&& cadenaFiltros.getListaValores().size() > 0) {
				int num = 0;
				for (Object valor : cadenaFiltros.getListaValores()) {
					query.setParameter(++num, valor);
				}
			}
			List<AccesoLocalizacionListaEntity> ls = query.getResultList();
		
		return ls;
	}

	@Override
	public GenericEntity guardarAccesoLocalizacion(AccesoLocalizacionDetRequest request) {
		
		StringBuilder jpql = new StringBuilder();
			jpql.append("select * from seguridad.sp_registrar_localizacion (:in_usuarioid, :in_paisid, :in_divisionid, :in_ciudadid, :in_active)");

		Query query = em.createNativeQuery(jpql.toString(), GenericEntity.class);
			query.setParameter("in_usuarioid", request.getCodUsuario());
			query.setParameter("in_paisid", request.getCodPais());
			query.setParameter("in_divisionid", request.getCodDivision());
			query.setParameter("in_ciudadid", request.getCodCiudad());
			query.setParameter("in_active", request.getActive());
		
		return (GenericEntity)query.getSingleResult();
	}

	@Override
	public GenericEntity actualizarAccesoLocalizacion( AccesoLocalizacionDetRequest request) {

		StringBuilder jpql = new StringBuilder();
			jpql.append("select * from seguridad.sp_actualizar_localizacion (:in_id,:in_usuarioid, :in_paisid, :in_divisionid, :in_ciudadid, :in_active)");

		Query query = em.createNativeQuery(jpql.toString(), GenericEntity.class);
			query.setParameter("in_id", request.getId());
			query.setParameter("in_usuarioid", request.getCodUsuario());
			query.setParameter("in_paisid", request.getCodPais());
			query.setParameter("in_divisionid", request.getCodDivision());
			query.setParameter("in_ciudadid", request.getCodCiudad());
			query.setParameter("in_active", request.getActive());
		
		return (GenericEntity)query.getSingleResult();
	}

	@Override
	public GenericEntity eliminarAccesoLocalizacion(int codigo) {
		
		StringBuilder jpql = new StringBuilder();
			jpql.append("select * from seguridad.sp_eliminar_localizacion(:in_id)");
		
		Query query = em.createNativeQuery(jpql.toString(), GenericEntity.class);
			query.setParameter("in_id", codigo);

		return (GenericEntity) query.getSingleResult();
	}

}
